package com.ztr.leetcode.constants.allconall;

import cn.hutool.core.io.FileUtil;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import com.youbenzi.md2.export.FileFactory;
import com.ztr.conversion.FileConvertUtil;
import com.ztr.conversion.config.Constants;
import com.ztr.conversion.util.MyFileUtil;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.util.List;

@SpringBootTest
public class ExcepleConstans {

    private final String WORD_FILE_PATH = Constants.DEFAULT_FOLDER_TMP + "/test.doc";
    private final String HTML_FILE_PATH = Constants.DEFAULT_FOLDER_TMP + "/test.html";
    private final String EXCEL_FILE_PATH = Constants.DEFAULT_FOLDER_TMP + "/test.xlsx";
    private final String MD_FILE_PATH = Constants.DEFAULT_FOLDER_TMP + "/test.md";
    private final String PDF_FILE_PATH = Constants.DEFAULT_FOLDER_TMP + "/test.pdf";


    /**
     * 测试数据转换功能。
     * 该方法旨在演示如何将一个Word文档转换为多种格式，包括DOCX, PDF, HTML, PNG和JPEG。
     * 使用了特定的文件路径和保存格式进行文件转换。
     * @throws Exception 如果文件操作或转换过程中出现错误，则抛出异常。
     */
    @Test
    public void testData() throws Exception {
        // 创建一个Document对象，用于处理Word文档。
        Document wpd = new Document(WORD_FILE_PATH);

        // 将Word文档保存为DOCX格式。
        wpd.save(Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.docx", SaveFormat.DOCX);
        // 将Word文档保存为PDF格式。
        wpd.save(Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.pdf", SaveFormat.PDF);
        // 将Word文档保存为HTML格式。
        wpd.save(Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.html", SaveFormat.HTML);
        // 将Word文档保存为PNG图像格式。
        wpd.save(Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.png", SaveFormat.PNG);
        // 将Word文档保存为JPEG图像格式。
        wpd.save(Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.jpg", SaveFormat.JPEG);
    }


    // ================================ ↓↓↓↓↓↓ 下面为自定义封装过的api ↓↓↓↓↓↓ ===================================

    /**
     * 测试将Word文档转换为HTML文件的功能。
     * 此方法演示了如何使用FileConvertUtil工具类将Word文档的字节内容转换为HTML文件。
     * 它首先从指定路径读取Word文档的字节内容，然后将这些内容转换为HTML格式，并保存到指定的临时目录中。
     *
     * @throws Exception 如果读取文件或转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testWord2Html() throws Exception {
        // 将Word文档字节内容转换为HTML文件
        File htmlFile = FileConvertUtil.wordBytes2HtmlFile(MyFileUtil.readBytes(WORD_FILE_PATH),
                Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.html");
        // 打印转换后的HTML文件路径
        System.out.println(htmlFile);
    }


    /**
     * 测试将Word文档转换为PDF的功能。
     * 此方法演示了如何使用FileConvertUtil工具类将字节流形式的Word文档转换为PDF文件。
     * 它首先从指定路径读取Word文档的字节流，然后将这个字节流转换为PDF格式，并保存到临时目录中。
     *
     * @throws Exception 如果转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testWord2Pdf() throws Exception {
        // 将Word文档字节流转换为PDF文件
        File pdfFile = FileConvertUtil.wordBytes2PdfFile(MyFileUtil.readBytes(WORD_FILE_PATH),
                Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test-word.pdf");
        // 打印转换后的PDF文件路径
        System.out.println(pdfFile);
    }


    /**
     * 测试将Word文档转换为JPEG图片的功能。
     * 此方法读取一个Word文档的字节内容，然后将其转换为一系列JPEG图片。
     * 主要目的是验证文档转换工具类的正确性。
     *
     * @throws Exception 如果读取文件或转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testWord2Jpg() throws Exception {
        // 读取Word文档的字节内容。
        byte[] wordFileBytes = MyFileUtil.readBytes(WORD_FILE_PATH);

        // 将Word文档的字节内容转换为JPEG图片列表，转换后的图片保存在默认的临时生成目录中。
        List<File> jpgFileList =
                FileConvertUtil.wordBytes2JpegFileList(wordFileBytes, Constants.DEFAULT_FOLDER_TMP_GENERATE);

        // 打印转换后的图片文件列表，用于验证转换结果。
        System.out.println(jpgFileList);
    }


    /**
     * 测试将Word文档转换为PNG图片的功能。
     * 此方法演示了如何将字节码形式的Word文档转换为一系列PNG图片。
     * @throws Exception 如果转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testWord2Png() throws Exception {
        // 读取Word文档的字节码表示
        byte[] wordFileBytes = MyFileUtil.readBytes(WORD_FILE_PATH);

        // 将Word文档的字节码转换为PNG图片列表
        List<File> pngFileList =
                FileConvertUtil.wordBytes2PngFileList(wordFileBytes, Constants.DEFAULT_FOLDER_TMP_GENERATE);

        // 打印转换后的PNG图片文件列表
        System.out.println(pngFileList);
    }


    /**
     * 测试HTML转换为Word的功能。
     * 该测试方法旨在验证HTML内容能否被正确转换为Word文档。
     * 它通过读取指定路径下的HTML文件内容，然后将其转换为Word文档。
     * 转换后的Word文档保存在临时目录中，并打印出其文件路径。
     *
     * @throws Exception 如果转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testHtml2Word() throws Exception {
        // 将HTML文件内容转换为Word文档
        File wordFile = FileConvertUtil.htmlBytes2WordFile(MyFileUtil.readBytes(HTML_FILE_PATH),
                Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.doc");
        // 打印转换后的Word文件路径
        System.out.println(wordFile);
    }


    /**
     * 测试HTML转换为PDF的功能。
     * 该方法读取指定路径下的HTML文件内容，将其转换为PDF格式，并输出转换后的文件路径。
     * 主要目的是验证HTML到PDF的转换逻辑是否正确，以及生成的PDF文件是否符合预期。
     *
     * @throws Exception 如果转换过程中发生错误，将抛出异常。
     */
    @Test
    public void testHtml2Pdf() throws Exception {
        // HTML文件内容通过读取指定路径的文件获取，转换后的PDF文件保存在临时目录下。
        File pdfFile = FileConvertUtil.htmlBytes2PdfFile(MyFileUtil.readBytes(HTML_FILE_PATH),
                Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test-html.pdf");
        // 输出转换后的PDF文件路径。
        System.out.println(pdfFile);
    }


    /**
     * 测试将HTML内容转换为JPEG图片的功能。
     * 此方法首先将HTML内容读取为字节数组，然后将其转换为JPEG图片格式的字节数组。
     * 最后，将JPEG图片字节数组写入文件系统，并打印出文件名。
     *
     * @throws Exception 如果读取文件、转换格式或写入文件过程中发生错误，则抛出异常。
     */
    @Test
    public void testHtml2Jpg() throws Exception {
        // 将HTML内容转换为JPEG格式的字节数组
        byte[] jpgBytes = FileConvertUtil.htmlBytes2JpgBytes(MyFileUtil.readBytes(HTML_FILE_PATH));

        // 将JPEG字节数组写入文件系统
        File file = FileUtil.writeBytes(jpgBytes, Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.jpg");

        // 打印生成的文件名
        System.out.println(file.getName());
    }


//    @Test
//    public void testHtml2PngBy2() throws Exception {
//        HtmlParser htmlParser = new HtmlParserImpl();
//        htmlParser.loadHtml(MyFileUtil.readFileContent(HTML_FILE_PATH));
//        ImageRenderer imageRenderer = new ImageRenderer(htmlParser);
//        String imgPath = Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.png";
//        MyFileUtil.touch(imgPath);
//        imageRenderer.saveImage(imgPath);
//    }

    /**
     * 测试将DOC格式的文档转换为DOCX格式。
     * 该方法演示了如何使用FileConvertUtil工具类将字节流形式的DOC文档转换为DOCX文件。
     * 它首先从指定路径读取DOC文档的字节流，然后将其转换为DOCX文件。
     * 转换后的DOCX文件保存在默认的临时文件夹中。
     *
     * @throws Exception 如果读取文件或转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testDoc2Docx() throws Exception {
        // 使用FileConvertUtil将DOC字节流转换为DOCX文件
        File docxFile = FileConvertUtil.docBytes2DocxFile(MyFileUtil.readBytes(WORD_FILE_PATH),
                Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test.docx");
        // 打印转换后的DOCX文件路径
        System.out.println(docxFile);
    }


    /**
     * 测试将Excel转换为PDF的功能。
     * 此方法演示了如何使用FileConvertUtil工具类将Excel文件的内容转换为PDF格式。
     * 它首先从指定路径读取Excel文件的内容为字节数组，然后调用工具类方法将这些字节内容转换为PDF文件。
     * 转换后的PDF文件保存在临时目录下，并打印出PDF文件的路径以供验证。
     *
     * @throws Exception 如果转换过程中发生任何错误，将抛出异常。
     */
    @Test
    public void testExcel2Pdf() throws Exception {
        // 将Excel文件内容转换为PDF文件
        File pdfFile = FileConvertUtil.excelBytes2PdfFile(MyFileUtil.readBytes(EXCEL_FILE_PATH),
                Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test-excel.pdf");
        // 打印转换后的PDF文件路径
        System.out.println(pdfFile);
    }


    /**
     * 测试HTML内容转换为PNG图像的功能。
     * 此方法读取一个HTML文件的内容，然后将其转换为一系列PNG图像文件。
     * 主要用于验证HTML到图像的转换逻辑是否正确。
     *
     * @throws Exception 如果文件读取或转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testHtml2Png() throws Exception {
        // 读取HTML文件的内容到字节数组
        byte[] htmlFileBytes = MyFileUtil.readBytes(HTML_FILE_PATH);

        // 将HTML内容转换为PNG图像文件列表
        List<File> pngFileList =
                FileConvertUtil.wordBytes2PngFileList(htmlFileBytes, Constants.DEFAULT_FOLDER_TMP_GENERATE);

        // 打印转换后的PNG文件列表
        System.out.println(pngFileList);
    }


    /**
     * 测试将Markdown文件转换为HTML文件的功能。
     * <p>
     * 本测试方法旨在验证Markdown解析器是否能正确地将Markdown源文件转换为HTML格式。
     * 它通过指定Markdown文件的路径，并指定生成的HTML文件的输出路径来执行转换过程。
     * 转换后的HTML文件被生成在临时目录中，方便后续检查和验证转换的准确性。
     *
     * @throws Exception 如果文件操作或转换过程中出现任何异常，则抛出。
     */
    @Test // 【 https://gitee.com/cevin15/MD2File 】 【 注：转换格式不是太完善，存在一定问题！ 】
    public void testMarkdown2Html() throws Exception {
        // 指定Markdown文件路径，并生成HTML文件到指定的临时目录中
        FileFactory.produce(new File(MD_FILE_PATH), Constants.DEFAULT_FOLDER_TMP_GENERATE + "/test-md.html");
    }


    /**
     * 测试PDF转Word功能。
     * 该测试方法旨在验证是否能够成功将一个PDF文件转换为Word文档。
     * 它使用了FileConvertUtil类的静态方法pdf2Word来进行转换。
     * @throws Exception 如果转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testPdf2Word() throws Exception {
        // 指定PDF文件路径和目标Word文档路径，调用转换方法。
        FileConvertUtil.pdf2Word(PDF_FILE_PATH, Constants.DEFAULT_FOLDER_TMP_GENERATE + "/pdf2word.docx");
    }


    /**
     * 测试将PDF文件转换为PNG图像的功能。
     * 此方法首先将PDF文件读取为字节数组，然后使用文件转换工具将这些字节数据转换为PNG图像文件列表。
     * @throws Exception 如果在读取文件或转换过程中发生错误，则抛出异常。
     */
    @Test
    public void testPdf2Png() throws Exception {
        // 从指定路径读取PDF文件的内容到字节数组
        byte[] pngBytes = MyFileUtil.readBytes(PDF_FILE_PATH);
        // 将PDF文件内容转换为PNG图像文件列表，输出到指定的临时目录
        FileConvertUtil.pdfBytes2PngFileList(pngBytes, Constants.DEFAULT_FOLDER_TMP_GENERATE + "/pdf2img");
    }


}
